home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / prlgbnc1.lha / Bench / crypt.pl < prev    next >
Text File  |  1990-07-13  |  2KB  |  85 lines

  1.  
  2. % Cryptomultiplication:
  3. % Find the unique answer to:
  4. %    OEE
  5. %     EE
  6. %     ---
  7. %      EOEE
  8. %      EOE
  9. %      ----
  10. %      OOEE
  11. %
  12. % where E=even, O=odd.
  13. % This program generalizes easily to any such problem.
  14. % Written by Peter Van Roy
  15.  
  16. main :-
  17.     odd(A), even(B), even(C),
  18.     even(E),
  19.     mult([C,B,A], E, [I,H,G,F|X]),
  20.     lefteven(F), odd(G), even(H), even(I), zero(X),
  21.     lefteven(D),
  22.     mult([C,B,A], D, [L,K,J|Y]),
  23.     lefteven(J), odd(K), even(L), zero(Y),
  24.     sum([I,H,G,F], [0,L,K,J], [P,O,N,M|Z]),
  25.     odd(M), odd(N), even(O), even(P), zero(Z).
  26.     % write(' '), write(A), write(B), write(C), nl,
  27.     % write('  '), write(D), write(E), nl,
  28.     % write(F), write(G), write(H), write(I), nl,
  29.     % write(J), write(K), write(L), nl,
  30.     % write(M), write(N), write(O), write(P), nl.
  31.  
  32. % Addition of two numbers
  33. sum(AL, BL, CL) :- sum(AL, BL, 0, CL).
  34.  
  35. sum([A|AL], [B|BL], Carry, [C|CL]) :- !,
  36.     X is (A+B+Carry),
  37.     C is X mod 10,
  38.     NewCarry is X // 10,
  39.     sum(AL, BL, NewCarry, CL).
  40. sum([], BL, 0, BL) :- !.
  41. sum(AL, [], 0, AL) :- !.
  42. sum([], [B|BL], Carry, [C|CL]) :- !,
  43.     X is B+Carry,
  44.     NewCarry is X // 10,
  45.     C is X mod 10,
  46.     sum([], BL, NewCarry, CL).
  47. sum([A|AL], [], Carry, [C|CL]) :- !,
  48.     X is A+Carry,
  49.     NewCarry is X // 10,
  50.     C is X mod 10,
  51.     sum([], AL, NewCarry, CL).
  52. sum([], [], Carry, [Carry]).
  53.  
  54. % Multiplication
  55. mult(AL, D, BL) :- mult(AL, D, 0, BL).
  56.  
  57. mult([A|AL], D, Carry, [B|BL] ) :-
  58.     X is A*D+Carry,
  59.     B is X mod 10,
  60.     NewCarry is X // 10,
  61.     mult(AL, D, NewCarry, BL).
  62. mult([], _, Carry, [C,Cend]) :-
  63.     C is Carry mod 10,
  64.     Cend is Carry // 10.
  65.  
  66. zero([]).
  67. zero([0|L]) :- zero(L).
  68.  
  69. odd(1).
  70. odd(3).
  71. odd(5).
  72. odd(7).
  73. odd(9).
  74.  
  75. even(0).
  76. even(2).
  77. even(4).
  78. even(6).
  79. even(8).
  80.  
  81. lefteven(2).
  82. lefteven(4).
  83. lefteven(6).
  84. lefteven(8).
  85.